例题2.8日期累加
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述：
输入第一行表示样例个数m，接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述：
输出m行，每行按yyyy-mm-dd的个数输出。
示例1
输入：
1
2008 2 3 100
复制
输出：
2008-05-13


//第一个自己的方法,第二个王道
#include<iostream>
#include<cstdio>
using namespace std;

int num[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int fun(int x)
{
	return (x%4==0&&x%100!=0)||x%400==0;
	
}
int main()
{
	int year,month,day;
	int sum,n;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d%d%d",&year,&month,&day,&sum);
		num[2]=28+fun(year);
		sum+=day;
		while(month>=1)
		{
			sum+=num[--month];
		}
		while(sum>=365)
		{
			sum-=fun(year)+365;
			year++;
		}
		month=1;
		num[2]=28+fun(year);
		while(sum>num[month])
		{
			sum-=num[month];
			month++;
		}
		day=sum;
		printf("%04d-%02d-%02d\n",year,month,day);
	}
	return 0;
}



#include<iostream>
using namespace std;

int daytab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

bool isLeepYear(int year){
    return (year % 4 == 0 && year % 100 !=0) || (year % 400 == 0);
}

int NumberOfYear(int year){
    if(isLeepYear(year)){
        return 366;
    }else{
        return 365;
    }
}

int main()
{
    int year, month, day;
    int number, n;
    scanf("%d", &n);
    while(n--){
        scanf("%d%d%d%d", &year, &month, &day, &number);
        int row = isLeepYear(year);
        for(int i = 0; i < month; i++ ){
            number += daytab[row][i];
        }
        number += day;
        while(number >= NumberOfYear(year)){
            number -= NumberOfYear(year);
            year++;
        }
        month = 0;
        row = isLeepYear(year);
        while(number > daytab[row][month]){
            number -= daytab[row][month];
            month++;
        }
        day = number;
        printf("%04d-%02d-%02d\n", year, month, day);
    }
    
    system("pause");
    return 0;
}